import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

//扩展解析器：你可以通过继承 Parser 类或使用 DelegateParser 类来创建自定义的解析器。
// 创建一个扩展解析器，用于解析形如 "[数字] + [数字]" 的字符串并计算它们的和
class SumParser extends DelegateParser {
  SumParser(Parser delegate) : super(delegate);

  @override
  Result parseOn(Context context) {
    final result = delegate.parseOn(context);
    if (result.isSuccess) {
      final values = result.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      final sum = firstNumber + secondNumber;
      return result.success(sum);
    } else {
      return result;
    }
  }

  @override
  Parser copy() {
    return SumParser(super.delegate);
  }
}

class EExtensionParser extends StatefulWidget {
  const EExtensionParser({super.key});

  @override
  State<EExtensionParser> createState() => _EExtensionParserState();
}

class _EExtensionParserState extends State<EExtensionParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  final parserStr = '1 + 2';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('扩展解析器'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                const Text(
                  '扩展解析器，用于解析形如 "[数字] + [数字]" \n的字符串并计算它们的和',
                  maxLines: 3,
                  style: TextStyle(overflow: TextOverflow.clip),
                ),
                Text('解析字符串:"$parserStr"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    // 创建一个解析器，用于解析一个数字字符并将其转换为整数
    final digitParser = digit().flatten().map(int.parse);

    // 创建一个解析器，用于解析 '+' 字符并忽略其两边的空白字符
    final operatorParser = char('+').trim();

    // 使用 `seq` 方法将 `digitParser` 和 `operatorParser` 组合成一个解析器
    // 这个解析器可以解析形如 "[数字] + [数字]" 的字符串
    final expressionParser = digitParser.seq(operatorParser).seq(digitParser);

    // 创建一个 `SumParser` 实例
    final sumParser = SumParser(expressionParser);

    // 使用 `sumParser` 来解析字符串 '1 + 2'
    final result = sumParser.parse('1 + 2');
    if (result.isSuccess) {
      resultStr = result.value.toString();
      // 如果解析成功，打印出两个数字的和
      print('The sum is ${result.value}');
    } else {
      resultStr = invalidStr;
      // 如果解析失败，打印 'Invalid input'
      print('Invalid input');
    }
  }
}
